home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / etc / syslog.c < prev    next >
C/C++ Source or Header  |  1990-01-23  |  5KB  |  252 lines

  1. /*
  2.  * syslog.c --
  3.  *
  4.  *     Sprite version of 4.3BSD's syslog facilty.
  5.  *
  6.  */
  7.  
  8. /*
  9.  * Copyright (c) 1983 Regents of the University of California.
  10.  * All rights reserved.  The Berkeley software License Agreement
  11.  * specifies the terms and conditions for redistribution.
  12.  */
  13.  
  14. #if defined(LIBC_SCCS) && !defined(lint)
  15. static char sccsid[] = "@(#)syslog.c    5.10 (Berkeley) 4/20/87";
  16. #endif LIBC_SCCS and not lint
  17.  
  18. /*
  19.  * SYSLOG -- print message on log file
  20.  *
  21.  * This routine looks a lot like printf, except that it
  22.  * outputs to the log file instead of the standard output.
  23.  * Also:
  24.  *    adds a timestamp,
  25.  *    prints the module name in front of the message,
  26.  *    has some other formatting types (or will sometime),
  27.  *    adds a newline on the end of the message.
  28.  *
  29.  * The output of this routine is intended to be read by /etc/syslogd.
  30.  *
  31.  * Author: Eric Allman
  32.  * (Modified to use UNIX domain IPC by Ralph Campbell)
  33.  *    Modified to use the Sprite /dev/syslog, fall 1987
  34.  */
  35.  
  36. #include <sys/types.h>
  37. #include <sys/file.h>
  38. #include <signal.h>
  39. #include <sys/syslog.h>
  40. #include <netdb.h>
  41. #include <strings.h>
  42. #include <stdio.h>
  43. #include <sys/wait.h>
  44.  
  45. #if defined(__STDC__) && !defined(spur) && !defined(sun4)
  46. #include <stdarg.h>
  47. #else
  48. #include <varargs.h>
  49. #endif
  50.  
  51. #define    MAXLINE    1024            /* max message size */
  52.  
  53. #define PRIFAC(p)    (((p) & LOG_FACMASK) >> 3)
  54. #define IMPORTANT     LOG_ERR
  55.  
  56. static char    logname[] = "/dev/syslog";
  57. static char    ctty[] = "/dev/console";
  58.  
  59. static int    LogFile = -1;        /* fd for log */
  60. static int    LogStat    = 0;        /* status bits, set by openlog() */
  61. static char    *LogTag = "syslog";    /* string to tag the entry with */
  62. static int    LogMask = 0xff;        /* mask of priorities to be logged */
  63. static int    LogFacility = LOG_USER;    /* default facility code */
  64.  
  65.  
  66. extern    int errno, sys_nerr;
  67. extern    char *sys_errlist[];
  68. extern    long time();
  69. extern    char *ctime();
  70.  
  71. extern int setlogmask();
  72. extern void closelog();
  73. extern void openlog();
  74.  
  75. #ifndef lint
  76. #if defined(__STDC__) && !defined(spur) && !defined(sun4)
  77. void
  78. syslog(int pri, const char *fmt, ...)
  79. {
  80. #else
  81. void
  82. syslog(va_alist)
  83.         va_dcl
  84. {
  85.         int pri;
  86.     char *fmt;
  87. #endif
  88.     char buf[MAXLINE + 1], outline[MAXLINE + 1];
  89.     register char *b, *o;
  90. #ifdef __STDC__
  91.     register const char *f;
  92. #else
  93.     register char *f;
  94. #endif
  95.     register int c;
  96.     long now;
  97.     int pid, olderrno = errno;
  98.     va_list args;
  99.  
  100. #if defined(__STDC__) && !defined(spur) && !defined(sun4)
  101.     va_start(args, fmt);
  102. #else
  103.     va_start(args);
  104.     pri = va_arg(args, int);
  105.     fmt = va_arg(args, char *);
  106. #endif
  107.     /* see if we should just throw out this message */
  108.     if (pri <= 0 || PRIFAC(pri) >= LOG_NFACILITIES ||
  109.         (LOG_MASK(pri) & LogMask) == 0)
  110.         return;
  111.     if (LogFile < 0)
  112.         openlog(LogTag, LogStat | LOG_NDELAY, 0);
  113.  
  114.     /* set default facility if none specified */
  115.     if ((pri & LOG_FACMASK) == 0)
  116.         pri |= LogFacility;
  117.  
  118.     /* build the message */
  119.     o = outline;
  120.     sprintf(o, "<%d>", pri);
  121.     o += strlen(o);
  122.     time(&now);
  123.     sprintf(o, "%.15s ", ctime(&now) + 4);
  124.     o += strlen(o);
  125.     if (LogTag) {
  126.         strcpy(o, LogTag);
  127.         o += strlen(o);
  128.     }
  129.     if (LogStat & LOG_PID) {
  130.         sprintf(o, "[%x]", getpid());
  131.         o += strlen(o);
  132.     }
  133.     if (LogTag) {
  134.         strcpy(o, ": ");
  135.         o += 2;
  136.     }
  137.  
  138.     b = buf;
  139.     f = fmt;
  140.     while ((c = *f++) != '\0' && c != '\n' && b < &buf[MAXLINE]) {
  141.         if (c != '%') {
  142.             *b++ = c;
  143.             continue;
  144.         }
  145.         if ((c = *f++) != 'm') {
  146.             *b++ = '%';
  147.             *b++ = c;
  148.             continue;
  149.         }
  150.         if ((unsigned)olderrno > sys_nerr)
  151.             sprintf(b, "error %d", olderrno);
  152.         else
  153.             strcpy(b, sys_errlist[olderrno]);
  154.         b += strlen(b);
  155.     }
  156.     *b++ = '\n';
  157.     *b = '\0';
  158.     vsprintf(o, buf, args);
  159.     va_end(args);
  160.     c = strlen(outline);
  161.     if (c > MAXLINE)
  162.         c = MAXLINE;
  163.  
  164.     /* output the message to the local logger */
  165.     if (write(LogFile, outline, c) >= 0)
  166.         return;
  167.     if (!(LogStat & LOG_CONS))
  168.         return;
  169.  
  170.     /* output the message to the console */
  171.     pid = vfork();
  172.     if (pid == -1)
  173.         return;
  174.     if (pid == 0) {
  175.         int fd;
  176.  
  177.         sigsetmask(sigblock(0));
  178.         fd = open(ctty, O_WRONLY);
  179.         strcat(o, "\r");
  180.         o = index(outline, '>') + 1;
  181.         write(fd, o, c + 1 - (o - outline));
  182.         close(fd);
  183.         _exit(0);
  184.     }
  185.     if (!(LogStat & LOG_NOWAIT))
  186.         while ((c = wait((union wait *)0)) > 0 && c != pid)
  187.             ;
  188. }
  189. #else /* lint */
  190. /*VARARGS2*/
  191. /*ARGSUSED*/
  192. void
  193. syslog(pri, fmt)
  194.     int pri;
  195.     char *fmt;
  196. {
  197.     return;
  198. }
  199. #endif /* !lint */
  200.  
  201. /*
  202.  * OPENLOG -- open system log
  203.  */
  204.  
  205. void
  206. openlog(ident, logstat, logfac)
  207.     char *ident;
  208.     int logstat, logfac;
  209. {
  210.     if (ident != NULL)
  211.         LogTag = ident;
  212.     LogStat = logstat;
  213.     if (logfac != 0)
  214.         LogFacility = logfac & LOG_FACMASK;
  215.     if (LogFile >= 0)
  216.         return;
  217.  
  218.     if (LogStat & LOG_NDELAY) {
  219.         LogFile = open(logname, O_WRONLY, 0);
  220.         fcntl(LogFile, F_SETFD, 1);
  221.     }
  222.     return;
  223. }
  224.  
  225. /*
  226.  * CLOSELOG -- close the system log
  227.  */
  228.  
  229. void
  230. closelog()
  231. {
  232.  
  233.     (void) close(LogFile);
  234.     LogFile = -1;
  235.     return;
  236. }
  237.  
  238. /*
  239.  * SETLOGMASK -- set the log mask level
  240.  */
  241. int
  242. setlogmask(pmask)
  243.     int pmask;
  244. {
  245.     int omask;
  246.  
  247.     omask = LogMask;
  248.     if (pmask != 0)
  249.         LogMask = pmask;
  250.     return (omask);
  251. }
  252.